﻿<Authorize()>
Public Class PacienteController
    Inherits BaseController(Of Paciente)

    Private ReadOnly repoPaciente_ As PacienteRepository
    Private ReadOnly repoTipoVía_ As TipoVíaRepository
    Private ReadOnly repoPoblación_ As PoblaciónRepository
    Private ReadOnly repoSociedad_ As SociedadRepository
    Private ReadOnly repoPediatra_ As PediatraRepository
    Private ReadOnly repoDirección_ As DirecciónRepository


    Public Sub New(ByVal repoPediatraAsindo As PediatraAsindoRepository, ByVal saver As ContextSaver,
        ByVal repoPediatra As PediatraRepository,
        ByVal repoSociedad As SociedadRepository,
        ByVal repoPacientes As PacienteRepository,
        ByVal repoTipoVía As TipoVíaRepository,
        ByVal repoPoblación As PoblaciónRepository,
        ByVal repoDirección As DirecciónRepository)
        MyBase.New(repoPediatraAsindo, saver)
        repoPaciente_ = repoPacientes
        repoTipoVía_ = repoTipoVía
        repoPoblación_ = repoPoblación
        repoSociedad_ = repoSociedad
        repoPediatra_ = repoPediatra
        repoDirección_ = repoDirección
    End Sub

    '
    ' GET: /Paciente
    <HttpGet()>
    Function Lista() As ViewResult
        Return Mostrar(repoPaciente_.All.Include("Sociedad").Include("Dirección.Población").Include("Dirección.TipoVía").Include("Avisos"), "Pacientes")
    End Function

    '
    ' GET: /Paciente
    <HttpGet()>
    Function ListaPediatra(pediatra As Integer) As ViewResult
        Dim ped = repoPediatra_.GetByID(pediatra)
        Return Mostrar(repoPaciente_.All.Where(Function(pac) pac.PediatraHabitualId.HasValue AndAlso pac.PediatraHabitualId.Value = pediatra).Include("Sociedad").Include("Dirección.Población").Include("Dirección.TipoVía").Include("Avisos"),
                       "Pacientes cuyo pediatra habitual es " & ped.NombreCompletoDerecho)
    End Function

    '
    ' GET: /Paciente
    <HttpGet()>
    Function ListaSociedad(sociedad As Integer) As ViewResult
        Dim soc = repoSociedad_.GetByID(sociedad)
        Return Mostrar(repoPaciente_.All.Where(Function(pac) pac.SociedadId.HasValue AndAlso pac.SociedadId.Value = sociedad).Include("Sociedad").Include("Dirección.Población").Include("Dirección.TipoVía").Include("Avisos"),
                       "Pacientes asociados a " & soc.Nombre)
    End Function

    '
    ' GET: /Paciente/Crear
    <HttpGet()>
    Function Crear() As ViewResult
        Return Mostrar(repoPaciente_.CreateDetached, "Nuevo paciente")
    End Function

    '
    ' POST: /Paciente/Crear

    <HttpPost()> _
    Function Crear(ByVal paciente As Paciente, <Bind(Prefix:="midir")> ByVal direcForm As Dirección) As ActionResult
        Try
            Dim dirVal As New DirecciónValidator

            Dim valResults = dirVal.Validate(direcForm)

            If Not valResults.IsValid Then
                For Each fail In valResults.Errors
                    ModelState.AddModelError("midir." & fail.PropertyName, fail.ErrorMessage)
                Next
                Return Mostrar(paciente, "Nuevo paciente")
            End If

            repoPaciente_.Add(paciente, save:=False)
            paciente.Dirección = repoDirección_.AddIfNotExists(direcForm)
            Saver.Save()
            TempData("info") = String.Format("Paciente {0} guardado correctamente", paciente.NombreCompleto)
            Return RedirectToAction("Lista")
        Catch ex As Exception
            Return Mostrar(repoPaciente_.CreateDetached, "Nuevo paciente", "Error al crear paciente: " & ex.Message)
        End Try
    End Function

    '
    ' GET: /Paciente/Editar/5
    Function Detalle(ByVal id As Integer) As PartialViewResult
        Dim paciente = repoPaciente_.GetByID(id)
        Return PartialView("DetallePaciente", paciente)
    End Function

    '
    ' GET: /Paciente/Editar/5
    Function Editar(ByVal id As Integer, Optional modal As Boolean = False) As ViewResult
        Dim pac = repoPaciente_.GetByID(id, "Dirección")
        Dim familia = repoPaciente_.All.Where(Function(pacfamilia) _
                                                  pacfamilia.Apellido1 = pac.Apellido1 AndAlso _
                                                  pacfamilia.Apellido2 = pac.Apellido2 AndAlso _
                                                  pacfamilia.Id <> pac.Id)

        ViewData("Modal") = modal
        ViewData("Familia") = familia
        Return Mostrar(pac, String.Format("Editar paciente {0}", pac.NombreCompletoDerecho), , modal)
    End Function

    '
    ' POST: /Paciente/Editar/5
    <HttpPost()>
    Function Editar(ByVal id As Integer, <Bind(Prefix:="midir")> ByVal direcForm As Dirección, Optional modal As Boolean = False) As ActionResult
        Dim paciente = repoPaciente_.GetByID(id)
        Try
            UpdateModel(paciente)

            paciente.Dirección = repoDirección_.AddIfNotExists(direcForm)
            repoDirección_.BorrarHuérfanas()
            Saver.Save()

            TempData("info") = String.Format("Paciente {0} modificado correctamente", paciente.NombreCompleto)
            Return RedirectToAction("Lista")
        Catch ex As Exception
            Return Mostrar(
                paciente,
                String.Format("Editar paciente {0}", paciente.NombreCompletoDerecho),
                "Error al editar paciente: " & ex.Message,
                modal)
        End Try
    End Function

    <HttpPost()>
    Function Borrar(ByVal id As Integer) As ActionResult
        Dim paciente = repoPaciente_.GetByID(id)
        Try
            repoPaciente_.Delete(paciente, save:=False)
            repoDirección_.BorrarHuérfanas()
            Saver.Save()
            TempData("info") = String.Format("Paciente {0} borrado correctamente", paciente.NombreCompleto)
            Return RedirectToAction("Lista")
        Catch ex As Exception
            Return Mostrar(paciente, "Error al borrar paciente: " & ex.Message)
        End Try
    End Function


    <HttpGet()>
    Function Direccion(ByVal pacienteId As Integer) As JsonResult
        Dim direc As Dirección

        direc = repoPaciente_.GetByID(pacienteId, "Dirección").Dirección

        Return Me.Json(direc.JSon, JsonRequestBehavior.AllowGet)
    End Function

    Protected Overrides Sub CargarDatosComunes()
        ViewData("ListaSociedades") = repoSociedad_.Desplegable
        ViewData("ListaPediatras") = repoPediatra_.Desplegable
        ViewData("ListaPoblaciones") = repoPoblación_.Desplegable
        ViewData("ListaTiposVia") = repoTipoVía_.Desplegable
    End Sub

    Protected Overrides Function VistaFormulario() As String
        Return "FormPaciente"
    End Function

    Protected Overrides Function VistaLista() As String
        Return "ListaPacientes"
    End Function

    Function EncontrarPacientes(ByVal term As String) As JsonResult
        'Return raw text, one result on each line
        Return Json(repoPaciente_.EncontrarPacientes(term), JsonRequestBehavior.AllowGet)
    End Function

End Class
